package com.example.video.common.http;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class HttpResult<T> {
    /**
     * 状态码
     */
    private String errcode;
    /**
     * 消息
     */
    private String errmsg;
    /**
     * 数据
     */
    private T data;

    /**
     * 成功返回结果
     *
     */
    public static <T> HttpResult<T> ok() {
        return new HttpResult<T>(ResultCode.SUCCESS.getErrorCode(), ResultCode.SUCCESS.getErrorMessage(), null);
    }

    /**
     * 成功返回结果
     *
     * @param data 获取的数据
     */
    public static <T> HttpResult<T> ok(T data) {
        return new HttpResult<T>(ResultCode.SUCCESS.getErrorCode(), ResultCode.SUCCESS.getErrorMessage(), data);
    }
    /**
     * 成功返回结果及提示信息
     *
     * @param  message 提示信息
     */
    public static <T> HttpResult<T> ok(String message) {
        return new HttpResult<T>(ResultCode.SUCCESS.getErrorCode(), message, null);
    }

    /**
     * 成功返回结果及提示信息
     *
     * @param data 获取的数据
     * @param  message 提示信息
     */
    public static <T> HttpResult<T> ok(T data, String message) {
        return new HttpResult<T>(ResultCode.SUCCESS.getErrorCode(), message, data);
    }

    /**
     * 失败返回结果
     */
    public static <T> HttpResult<T> fail() {
        return fail(ResultCode.USER_ERROR_0001);
    }

    /**
     * 失败返回结果
     * @param errorCode 错误码
     */
    public static <T> HttpResult<T> fail(IErrorCode errorCode) {
        return new HttpResult<T>(errorCode.getErrorCode(), errorCode.getErrorMessage(), null);
    }

    /**
     * 失败返回结果
     */
    public static <T> HttpResult<T> fail(String message) {
        return new HttpResult<T>(ResultCode.USER_ERROR_0001.getErrorCode(), message, null);
    }

    /**
     * 失败返回结果
     * @param errorCode 错误码
     * @param message 错误信息
     */
    public static <T> HttpResult<T> fail(IErrorCode errorCode,String message) {
        return new HttpResult<T>(errorCode.getErrorCode(), message, null);
    }


    /**
     * 参数验证失败返回结果
     */
    public static <T> HttpResult<T> validateFailed() {
        return fail(ResultCode.USER_ERROR_A0402);
    }

    /**
     * 参数验证失败返回结果
     * @param message 提示信息
     */
    public static <T> HttpResult<T> validateFailed(String message) {
        return new HttpResult<T>(ResultCode.USER_ERROR_A0402.getErrorCode(), message, null);
    }

    /**
     * 未登录返回结果
     * @param data 获取的数据
     * @param <T> 数据类型
     */
    public static <T> HttpResult<T> unauthorized(T data) {
        return new HttpResult<T>(ResultCode.USER_ERROR_A0200.getErrorCode(), ResultCode.USER_ERROR_A0200.getErrorMessage(), data);
    }

    /**
     * 未授权返回结果
     * @param data 获取的数据
     * @param <T> 数据类型
     */
    public static <T> HttpResult<T> forbidden(T data) {
        return new HttpResult<T>(ResultCode.USER_ERROR_A0301.getErrorCode(), ResultCode.USER_ERROR_A0301.getErrorMessage(), data);
    }
}

